package com.gper.edu.mytrait

/**
 * 特质循环依赖问题： 自身类型
 */
object TraitSelfTypeDemo {
  def main(args: Array[String]): Unit = {
    val consoles = new ConsoleDemo
    consoles.log
  }
}

/**
 * LoggerDemo就是自身类型特质，当这里做了自身类型后，那么
 * trait LoggerDemo extends Exception ,要求混入特质LoggerDemo的类也是Exception的子类
 */
trait LoggerDemo{
  /**
   * 告诉编译器，我就是Exception，如果没有这句话，下面的getMessage就不能使用
   */
  this:Exception => {
    def log() ={
      /**
       * 既然我就是Exception，那么就可以调用其中的方法
       */
      println(getMessage)
    }
  }
}

/**
 * Console在混入Logger类时，必须保证其是Exception子类
 */
class ConsoleDemo extends Exception with LoggerDemo{
  def log(): Unit ={
    println("======>"+getMessage)
  }
}